home *** CD-ROM | disk | FTP | other *** search
Wrap
Text File | 1996-04-25 | 6.0 KB | 184 lines | [ TEXT/CWIE]
//================================================================================ // Greg Anderson // db+ // // Abstract base class for cursors // 16 May 1994 //================================================================================ #pragma once #ifndef __ABSTRACTRECORD__ #define __ABSTRACTRECORD__ // // TTransactionAwareObject is the base class of TAbstractRecord // #include "TransactionAwareObject.h" // // We return cursors of different classes, so we need the // full definition of all of them. // #include "ReferenceTemplates.h" // // For CompareEnumeration // #include "AbstractData.h" // // For REQUIREVALIDPOINTER // #include "Exceptions.h" class TDatabaseDocument; class TGroupControlObject; // // This identifier is used to indicate the absence of a record // const long kNilIndex = -1; // // TDBElement and TDBProperty are the two // derived classes of TAbstractRecord. The low level // code knows nothing about their contents, but provides // two virtual methods to do safe downcasting. // class TDBRecord; class TDBElement; class TDBProperty; class TDataRecord; //================================================================================ // Class TAbstractRecord //================================================================================ class TAbstractRecord : public TTransactionAwareObject { // // ----- Fields -------------------------------------------------------------- // protected: TDatabaseDocument* fDocument; TGroupControlObject* fGroupControlObject; long fRecordIndex; long* fChangeImage; unsigned char fChangeImageUnchanged; unsigned char fChangeImageMayHaveChangedBack; // // ----- Methods ------------------------------------------------------------- // private: void CacheGroupControlObject(); public: TAbstractRecord(TDatabaseDocument* doc, long recordIndex); virtual ~TAbstractRecord(); //:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: // Methods of TTransactionAwareObject: //:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: virtual Int64 ObjectsKeySpace() const; virtual long ObjectKey() const { return fRecordIndex; }; protected: virtual void CommitChanges(TTransaction* transaction); virtual void DiscardChanges(TTransaction* transaction); //:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: // Public interface: const methods //:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: public: TDatabaseDocument* DBDocument() const { return fDocument; }; // // Delete this if we can // virtual Boolean RemoveReference() const; virtual void DisposeRecordIfUnreferenced(); long RecordIndex() const { return fRecordIndex; }; virtual AConst<TAbstractRecord> GetRecordCursor(long recordIndex) const; virtual AConst<TDBRecord> GetDBRecordCursor(long recordIndex) const; virtual AConst<TDBElement> GetDBElementCursor(long recordIndex) const; virtual AConst<TDBProperty> GetDBPropertyCursor(long recordIndex) const; virtual AConst<TDataRecord> GetDataCursor(long recordIndex) const; AConst<TAbstractRecord> RecordCursor() const { return AConst<TAbstractRecord>(this); } AConst<TDBRecord> DBRecordCursor() const { return AConst<TDBRecord>(this->AbstractDBRecord()); } AConst<TDBElement> DBElementCursor() const { return AConst<TDBElement>(this->DBElementRecord()); } AConst<TDBProperty> DBPropertyCursor() const { return AConst<TDBProperty>(this->DBPropertyRecord()); } AConst<TDataRecord> DataCursor() const { return AConst<TDataRecord>(this->DataRecord()); } // // Get data from cursor // long GetRecordData(TTransaction* transaction, long longwordNumber) const; Boolean ThisRecordIsFree(TTransaction* transaction) const; // // Compare contents of record with something // CompareEnumeration CompareRecordData(TTransaction* transaction, long dataType, long longwordNumber, long numberOfBytes, const TAbstractDataReference& compareWith) const; Boolean RecordDataContains(TTransaction* transaction, long dataType, long longwordNumber, long numberOfBytes, const TAbstractDataReference& compareWith) const; // // Do debugging tests on this node // virtual void Verify(TTransaction* t, Boolean verifyDeep = false) const = 0; //:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: // Public interface: non-const methods //:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: public: // // Change data in cursor (but change isn't permanent until CommitChanges // is called) // void ChangeRecordData(TTransaction* transaction, long longwordNumber, long newValue); virtual void FreeOwnedData(TTransaction* transaction); virtual void FreeThisRecord(TTransaction* transaction); //:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: // Protected interface: //:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: // // Only called from TGroupControlObject::WriteThroughToTransaction // void WriteThroughToTransaction(long longwordNumber, long theData, long theMask); protected: TGroupControlObject* GroupControlObject() const { REQUIREVALIDPOINTER(fGroupControlObject); return fGroupControlObject; }; Boolean HasGroupControlObject() const { return fGroupControlObject != nil; } //:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: // Private methods: //:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: // // Used by compare methods to get a reference to the // record's in-line data // const TConstDataReference RecordDataReference(TTransaction* transaction, long dataType, long longwordNumber, long numberOfBytes) const; private: // // Used at commit/discard time to add/return a free record // to the free list. // void PushRecordIfFree(TTransaction* transaction); }; #endif